package com.yzf.demo.demo.Thread.lock;

import java.util.concurrent.CyclicBarrier;

/**
 * Created by 于占峰 on 2020/4/4/004.
 */
public class CyclicBarrierDemo2 extends Thread {


    @Override
    public void run() {
        System.out.println("所有子线程执行完毕,唤醒所有子线程,执行CyclicBarrierDemo2.run");
    }

    /**
     * 1. parties,如果因为某种原因导致没有足够多的线程来调用await,
     * 就会导致所有线程都被阻塞
     * 2.await(timeout,timeuit) 设置一个超时时间 超时后抛出异常 释放子线程
     * 3.reset 重置计数, 重置计数后,在抛出 brokenBarrierException异常
     *
     * @param args
     */
    public static void main(String[] args) {
        //声明一个CyclicBarrier 传入触发CyclicBarrier唤醒线程的子线程数量 和 一个Runable
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new CyclicBarrierDemo2());
        //创建三个子线程
        new CyclicBarrierDemo1("path1", cyclicBarrier).start();
        new CyclicBarrierDemo1("path1", cyclicBarrier).start();
        new CyclicBarrierDemo1("path1", cyclicBarrier).start();
        //cyclicBarrier.reset();
        //当所有3个子线程执行完毕后 会唤醒所有子线程 最后执行 CyclicBarrierDemo2的run方法
    }
}
